package bd;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**Classe painelTabelas, encarregada de criar os paineis das tabelas
 */
public class painelTabelas extends javax.swing.JPanel {

    private conecta bd;//conexao com o banco de dados
    private frame principal;// frame principal
    protected String condicoes;//String que guarda as condicoes para buscas e atualizacoes
    protected String novaLinha;//String que guarda a nova tupla para atualizacao
    protected ResultSet retorno;
    private pDep painelDepartamento;
    private pTrab painelTrabalho;
    private pDepe painelDependente;
    private pFun painelFuncionario;
    private pJo painelJornal;
    private pExJo painelExJornal;
    private pCo painelComercial;
    private pExCo painelExComercial;

    /**  Construtor da classe painelTabelas que associa cada painel
     * à janela principal
     */
    public painelTabelas(conecta bd, frame frame) {
        this.bd = bd;
        this.principal = frame;
        this.painelDepartamento = new pDep(bd, principal, this);
        this.painelTrabalho = new pTrab(bd, principal, this);
        this.painelDependente = new pDepe(bd, principal, this);
        this.painelFuncionario = new pFun(bd, principal, this);
        this.painelJornal = new pJo(bd, principal, this);
        this.painelExJornal = new pExJo(bd, principal, this);
        this.painelComercial = new pCo(bd, principal, this);
        this.painelExComercial = new pExCo(bd, principal, this);
        initComponents();
        abaEdicaoTabelas.addTab("Departamento", painelDepartamento);
        abaEdicaoTabelas.addTab("Trabalho", painelTrabalho);
        abaEdicaoTabelas.addTab("Dependente", painelDependente);
        abaEdicaoTabelas.addTab("Funcionário", painelFuncionario);
        abaEdicaoTabelas.addTab("Jornal", painelJornal);
        abaEdicaoTabelas.addTab("Exibição Jornal", painelExJornal);
        abaEdicaoTabelas.addTab("Comercial", painelComercial);
        abaEdicaoTabelas.addTab("Exibição Comercial", painelExComercial);
    }

    /** Método initComponents(). tem a função da criação da janela de painel de tabelas,
     * criando botões, caixas de texto, etc. É o método que dá forma à janela.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        painelPrincipal = new javax.swing.JTabbedPane();
        abaEdicaoTabelas = new javax.swing.JTabbedPane();
        abaProcedimentos = new javax.swing.JPanel();
        exSerie = new javax.swing.JButton();
        anos = new javax.swing.JButton();
        salario = new javax.swing.JButton();
        jLabel56 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea2 = new javax.swing.JTextArea();
        serieProc = new javax.swing.JTextField();
        anosTrab = new javax.swing.JTextField();
        salarioMinimo = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        abaBuscas = new javax.swing.JPanel();
        buscaIbope = new javax.swing.JButton();
        buscaDependentes = new javax.swing.JButton();
        buscaSeries = new javax.swing.JButton();
        jLabel49 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        setPreferredSize(new java.awt.Dimension(750, 450));

        painelPrincipal.setPreferredSize(new java.awt.Dimension(725, 425));

        abaEdicaoTabelas.setTabPlacement(javax.swing.JTabbedPane.LEFT);
        abaEdicaoTabelas.setMinimumSize(new java.awt.Dimension(600, 350));
        abaEdicaoTabelas.setPreferredSize(new java.awt.Dimension(600, 350));
        painelPrincipal.addTab("Edição de Tabelas", abaEdicaoTabelas);

        abaProcedimentos.setPreferredSize(new java.awt.Dimension(600, 700));

        exSerie.setText("Exibição Serie");
        exSerie.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exSerieActionPerformed(evt);
            }
        });

        anos.setText("Anos Trabalhados");
        anos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                anosActionPerformed(evt);
            }
        });

        salario.setText("Mínimo Salarial");
        salario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                salarioActionPerformed(evt);
            }
        });

        jLabel56.setText("Descrições:");

        jTextArea2.setColumns(20);
        jTextArea2.setRows(5);
        jTextArea2.setText("Exibição Serie:\nMostra o número de vezes que uma determinada\nserie foi exibida, por ano.\n\n\nAnos Trabalhados:\nMostra os funcionarios da empresa que traba-\nlham a mais de X anos na empresa.\n\n\nMínimo Salarial:\nMostra os funcionarios que recebem mais do\nque X reais.");
        jScrollPane2.setViewportView(jTextArea2);

        jLabel1.setText("Nome da Série:");

        jLabel2.setText("Anos de Trabalho:");

        jLabel3.setText("Valor Mínimo de Salario:");

        javax.swing.GroupLayout abaProcedimentosLayout = new javax.swing.GroupLayout(abaProcedimentos);
        abaProcedimentos.setLayout(abaProcedimentosLayout);
        abaProcedimentosLayout.setHorizontalGroup(
            abaProcedimentosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(abaProcedimentosLayout.createSequentialGroup()
                .addGap(26, 26, 26)
                .addGroup(abaProcedimentosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(anosTrab, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                    .addComponent(salarioMinimo, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                    .addComponent(serieProc, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                    .addComponent(exSerie, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                    .addComponent(anos, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                    .addComponent(salario, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(abaProcedimentosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel56)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 367, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(201, 201, 201))
        );
        abaProcedimentosLayout.setVerticalGroup(
            abaProcedimentosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(abaProcedimentosLayout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addComponent(jLabel56)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(abaProcedimentosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(abaProcedimentosLayout.createSequentialGroup()
                        .addComponent(exSerie)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(serieProc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(anos)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(anosTrab, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(23, 23, 23)
                        .addComponent(salario)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(salarioMinimo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 268, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(98, Short.MAX_VALUE))
        );

        painelPrincipal.addTab("Procedimentos", abaProcedimentos);

        buscaIbope.setText("IBOPES");
        buscaIbope.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaIbopeActionPerformed(evt);
            }
        });

        buscaDependentes.setText("DEPENDENTES");
        buscaDependentes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaDependentesActionPerformed(evt);
            }
        });

        buscaSeries.setText("SERIES");
        buscaSeries.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaSeriesActionPerformed(evt);
            }
        });

        jLabel49.setText("Descrições:");

        jTextArea1.setColumns(15);
        jTextArea1.setRows(5);
        jTextArea1.setText("Busca IBOPES:\nListar todos os programas que foram exibidos no\nano de 2011 pela ordem de IBOPE MEDIO (exibições\ndo mesmo programa = ID)\n\nBusca DEPENDENTES:\nListar o numero de dependentes por departamento,\npara os departamentos que tenham mais do que 5\ndependentes com menos de 18 anos cadastrados\n\nBusca SERIES:\nListar serie, temporada, episodio e ibope medio,\nordenado por ibope medio");
        jTextArea1.setPreferredSize(new java.awt.Dimension(350, 150));
        jTextArea1.setRequestFocusEnabled(false);
        jScrollPane1.setViewportView(jTextArea1);

        javax.swing.GroupLayout abaBuscasLayout = new javax.swing.GroupLayout(abaBuscas);
        abaBuscas.setLayout(abaBuscasLayout);
        abaBuscasLayout.setHorizontalGroup(
            abaBuscasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(abaBuscasLayout.createSequentialGroup()
                .addGap(26, 26, 26)
                .addGroup(abaBuscasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(buscaIbope, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(buscaSeries, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(buscaDependentes, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(54, 54, 54)
                .addGroup(abaBuscasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel49)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(162, 162, 162))
        );
        abaBuscasLayout.setVerticalGroup(
            abaBuscasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(abaBuscasLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel49)
                .addGap(11, 11, 11)
                .addGroup(abaBuscasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(abaBuscasLayout.createSequentialGroup()
                        .addComponent(buscaIbope)
                        .addGap(75, 75, 75)
                        .addComponent(buscaDependentes)
                        .addGap(63, 63, 63)
                        .addComponent(buscaSeries))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 258, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(328, 328, 328))
        );

        painelPrincipal.addTab("Buscas Pré-definidas", abaBuscas);

        add(painelPrincipal);
    }// </editor-fold>//GEN-END:initComponents

    /** Trata eventos relacionados ao botão buscar ibope.
     * Faz uma busca pré definida.
     */
    private void buscaIbopeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaIbopeActionPerformed
        String consulta = "SELECT ID, TITULO, \"IBOPE MEDIO\""
                + " FROM (SELECT filme.idPr AS \"ID\" , filme.tituloPr AS \"TITULO\", AVG(exibicaoFilme.ibopeExFi) AS \"IBOPE MEDIO\""
                + " FROM filme JOIN exibicaoFilme"
                + "	ON filme.idPr = exibicaoFilme.idPr"
                + " WHERE EXTRACT(YEAR from exibicaoFilme.dataExFi) = 2011"
                + "	GROUP BY filme.idPr, filme.tituloPr"
                + " UNION"
                + "	SELECT serie.idPr AS \"ID\", serie.tituloPr AS \"TITULO\", AVG(exibicaoSerie.ibopeExSe) AS \"IBOPE MEDIO\""
                + "	FROM serie JOIN exibicaoSerie"
                + " ON serie.idPr = exibicaoSerie.idPr"
                + "  WHERE EXTRACT(YEAR from exibicaoSerie.dataExSe) = 2011"
                + "	GROUP BY serie.idPr, serie.tituloPr"
                + " UNION"
                + "	SELECT jornal.idPr AS \"ID\", jornal.tituloPr AS \"TITULO\", AVG(exibicaoJornal.ibopeExJo) AS \"IBOPE MEDIO\""
                + "	FROM jornal JOIN exibicaoJornal"
                + "	ON jornal.idPr = exibicaoJornal.idPr"
                + " WHERE EXTRACT(YEAR from exibicaoJornal.dataExJo) = 2011"
                + "	GROUP BY jornal.idPr, jornal.tituloPr"
                + " UNION"
                + "	SELECT novela.idPr AS \"ID\", novela.tituloPr AS \"TITULO\",AVG(exibicaoNovela.ibopeExNo) AS \"IBOPE MEDIO\""
                + "	FROM novela JOIN exibicaoNovela"
                + "	ON novela.idPr = exibicaoNovela.idPr"
                + " WHERE EXTRACT(YEAR from exibicaoNovela.dataExNo) = 2011"
                + "	GROUP BY novela.idPr, novela.tituloPr"
                + ")"
                + " WHERE \"IBOPE MEDIO\" > 0"
                + " ORDER BY \"IBOPE MEDIO\" desc";
                try {
            retorno = bd.consulta(consulta);
            this.principal.mostraBusca(retorno);
            retorno = null;
        } catch (SQLException ex) {
            bd.trataErro(ex);
        }
        retorno = null;
    }//GEN-LAST:event_buscaIbopeActionPerformed

    /** Trata eventos relacionados ao botão buscar dependentes.
     * Faz uma busca pré definida.
     */
    private void buscaDependentesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaDependentesActionPerformed
        try {
            retorno = bd.consulta("SELECT departamento.nomeDe AS \"DEPARTAMENTO\", COUNT(*) AS \"TOTAL DE DEPENDENTES\""
                    + " FROM departamento"
                    + " JOIN trabalho ON departamento.idDe = trabalho.idDe"
                    + " JOIN funcionario ON trabalho.idFu = funcionario.idFu "
                    + " JOIN dependente ON funcionario.idFu = dependente.idFu"
                    + " WHERE SYSDATE - dataNascimentoDe < 365*18"
                    + " GROUP BY departamento.nomeDe"
                    + " HAVING COUNT(*) > 5");
            this.principal.mostraBusca(retorno);
            retorno = null;
        } catch (SQLException ex) {
            bd.trataErro(ex);
        }
        retorno = null;
    }//GEN-LAST:event_buscaDependentesActionPerformed

    /** Trata eventos relacionados ao botão buscar série.
     * Faz uma busca pré definida
     */
    private void buscaSeriesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaSeriesActionPerformed
        try {
            retorno = bd.consulta("SELECT serie.tituloPr AS \"SERIE\", temporada.nroTe AS \"TEMPORADA\", episodioSerie.tituloEpSe AS \"EPISODIO\", AVG(exibicaoSerie.ibopeExSe) AS \"IBOPE MEDIO\""
                    + " FROM serie"
                    + " JOIN temporada ON serie.idPr = temporada.idPr"
                    + " JOIN episodioSerie ON episodioSerie.idPr = temporada.idPr AND episodioSerie.nroTe = temporada.nroTe"
                    + " JOIN exibicaoSerie ON exibicaoSerie.idPr = episodioSerie.idPr AND exibicaoSerie.nroTe = episodioSerie.nroTe AND exibicaoSerie.nroEpSe = episodioSerie.nroEpSe"
                    + " GROUP BY ROLLUP (serie.tituloPr, temporada.nroTe, episodioSerie.tituloEpSe)"
                    + " ORDER BY \"IBOPE MEDIO\"");
            this.principal.mostraBusca(retorno);
            retorno = null;
        } catch (SQLException ex) {
            bd.trataErro(ex);
        }
        retorno = null;
    }//GEN-LAST:event_buscaSeriesActionPerformed

    /** Trata eventos relacionados ao botão exibicão serie.
     * Executa o procedimento de exibição de série
     */
    private void exSerieActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exSerieActionPerformed
        if (serieProc.getText() != null && !serieProc.getText().trim().equals("")) {
            String sql = "{call ? := pega_exibicao(?)}";
            try {
                retorno = bd.chamaProcedimento(sql, serieProc.getText());
                this.principal.mostraBusca(retorno);
            } catch (SQLException ex) {
                bd.trataErro(ex);
            }
        }
    }//GEN-LAST:event_exSerieActionPerformed

    /** Trata eventos relacionados ao botão anos trabalhados.
     * Executa o procedimento de anos trabalhados
     */
    private void anosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_anosActionPerformed
        if (anosTrab.getText() != null && !anosTrab.getText().trim().equals("")) {
            String sql = "{call ? := funcionariosVelhos(?)}";
            try {
                retorno = bd.chamaProcedimento(sql, anosTrab.getText());
                this.principal.mostraBusca(retorno);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Campo(ano) inválido!");
            }
        }
    }//GEN-LAST:event_anosActionPerformed

    /** Trata eventos relacionados ao botão minimo salarial.
     * Executa o procedimento de minimo salarial
     */
    private void salarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_salarioActionPerformed
        if (salarioMinimo.getText() != null && !salarioMinimo.getText().trim().equals("")) {
            String sql = "{call ? := salario(?)}";
            try {
                retorno = bd.chamaProcedimento(sql, salarioMinimo.getText());
                this.principal.mostraBusca(retorno);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Campo(salario) inválido!");
            }
        }
    }//GEN-LAST:event_salarioActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel abaBuscas;
    public javax.swing.JTabbedPane abaEdicaoTabelas;
    private javax.swing.JPanel abaProcedimentos;
    private javax.swing.JButton anos;
    private javax.swing.JTextField anosTrab;
    private javax.swing.JButton buscaDependentes;
    private javax.swing.JButton buscaIbope;
    private javax.swing.JButton buscaSeries;
    private javax.swing.JButton exSerie;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel49;
    private javax.swing.JLabel jLabel56;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextArea jTextArea2;
    public javax.swing.JTabbedPane painelPrincipal;
    private javax.swing.JButton salario;
    private javax.swing.JTextField salarioMinimo;
    private javax.swing.JTextField serieProc;
    // End of variables declaration//GEN-END:variables

    /** Método para remoção de uma linha
     */
    void remover() {
        bd.remove("DELETE FROM " + novaLinha + " " + condicoes);
        zeraCondicoes();
        zeraNovaLinha();
    }

    /** Limpa variavel novaLinha
     */
    void zeraNovaLinha() {
        novaLinha = null;
    }

    /** Limpa a variavel condicoes
     */
    void zeraCondicoes() {
        condicoes = null;
    }
}
